---@class GT.unitGroup 单位组
---@field unitGroup UnitGroup 单位组
GT.unitGroup = class()

---@class unitGroup_data
---@field unitGroup UnitGroup 单位组

---@param data unitGroup_data
function GT.unitGroup:ctor(data)
    self.unitGroup = data.unitGroup
end

---@param unitGroup UnitGroup
---@return GT.unitGroup
function GT.unitGroup.obj(unitGroup)
    return new(GT.unitGroup,{ unitGroup=unitGroup})
end

--- 单位组是否存在
---@return Bool
function GT.unitGroup:isNull()
    return game_api.unit_group_is_exist(self.unitGroup)
end



---单位组转lua Table
---@return GT.unit[]
function GT.unitGroup:pick()
    ---@type GT.unit[]
    local lua_table ={}
    for i = 1, python_len(self.unitGroup) do
        local iter_unit =  python_index(self.unitGroup,i-1)
        table.insert(lua_table,GT.unit.get_unit_by_id(iter_unit))
    end
    return lua_table
end

--- 添加单位到单位组
---@param unit Unit 单位
---@param unit_group UnitGroup 单位组
function GT.unitGroup:add(unit)
    game_api.add_unit_to_group(unit, self.unitGroup)
end

--- 删除单位组中某种单位
---@param unit_key UnitKey 单位编号
function GT.unitGroup:del_unitKey(unit_key)
    game_api.remove_unit_in_group_by_key(self.unitGroup, unit_key)
end

--- 删除单位组中某个单位
---@param unit Unit 单位
function GT.unitGroup:del_unit(unit)
    game_api.remove_unit_in_group(self.unitGroup, unit)
end

--- 设置单位组中单位选中
function GT.unitGroup:set_unit_group_selected()
    game_api.set_unit_group_selected(self.unitGroup)
end

--- 单位组某状态的单位数量
---@param status Str 状态名称
---@return Int32
function GT.unitGroup:get_state_unit_num_in_group(status)
    return game_api.get_state_unit_num_in_group(self.unitGroup, status)
end

--- 单位组中特定单位编号的单位数量
---@param unit_key UnitKey 单位编号
---@return UInt32
function GT.unitGroup:get_num_of_unit_key_in_group(unit_key)
    return game_api.get_num_of_unit_key_in_group(nit_key)
end

--- 遍历时过滤单位组
---@param unit_group GT.unitGroup 单位组
---@return GT.unitGroup
function GT.unitGroup.refresh_unit_group(unit_group)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.refresh_unit_group(unit_group.unitGroup)
    }
    return new(GT.unitGroup, data)
end

--- 单位组内所有状态的单位数量
---@return Int32
function GT.unitGroup:get_unit_group_num()
    return game_api.get_unit_group_num(self.unitGroup)
end

--- 筛选范围内单位
---@param pos Vector3 坐标
---@param shape Shape 形状
---@param belong_role_group Role 属于玩家或玩家组
---@param visible_role Role 对玩家可见
---@param invisible_role Role 对玩家不可见
---@param exclude_unit_group UnitGroup 不在单位组内
---@param with_tag Str 具有标签
---@param without_tag Str 不具有标签
---@param entity_no UnitKey 单位名称
---@param exclude_unit Unit 排除单位
---@param unit_type UnitType 单位种类
---@param in_state UInt32 具有状态
---@param not_in_state UInt32 不具有状态
---@param include_dead Bool 是否包括死亡单位
---@param max_count Int32 数量上限
---@param sort_type SortType 排序类型
---@return GT.unitGroup
function GT.unitGroup.filter_unit_id_list_in_area_v2(pos, shape, belong_role_group, visible_role, invisible_role,
                                                     exclude_unit_group, with_tag, without_tag, entity_no, exclude_unit,
                                                     unit_type, in_state, not_in_state, include_dead, max_count,
                                                     sort_type)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.filter_unit_id_list_in_area_v2(pos, shape, belong_role_group, visible_role, invisible_role,
            exclude_unit_group, with_tag, without_tag, entity_no, exclude_unit, unit_type, in_state, not_in_state,
            include_dead, max_count, sort_type)
    }
    return new(GT.unitGroup, data)
end

--- 单位组内随机一个单位
---@return Unit
function GT.unitGroup:get_random_unit_in_unit_group()
    return game_api.get_random_unit_in_unit_group(self.unitGroup)
end

--- 根据属性值从单位组中取整数个单位
---@param attr Str 属性
---@param rise Bool 是否升序排列
---@param num UInt32 单位个数
---@return GT.unitGroup
function GT.unitGroup:get_unit_sort_by_attr(attr, rise, num)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.get_unit_sort_by_attr(self.unitGroup, attr, rise, num)
    }
    return new(GT.unitGroup, data)
end

--- 根据距离从单位组中取整数个单位
---@param point GT.point 点
---@param rise Bool 是否升序排列
---@param num UInt32 单位个数
---@return GT.unitGroup
function GT.unitGroup:get_unit_sort_by_position(point, rise, num)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.get_unit_sort_by_position(self.unitGroup, point.point, rise, num)
    }
    return new(GT.unitGroup, data)
end

--- 获取固定单位编号的单位组
---@param unit_key UnitKey 单位编号
---@return GT.unitGroup
function GT.unitGroup.get_units_by_key(unit_key)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.get_units_by_key(unit_key)
    }
    return new(GT.unitGroup, data)
end

--- 单位组内随机整数个单位
---@param n UInt32 随机个数
---@return UnitGroup
function GT.unitGroup:get_random_n_unit_in_group(n)
    ---@type unitGroup_data
    local data = {
        unitGroup = game_api.get_random_n_unit_in_group(self.unitGroup, n)
    }
    return new(GT.unitGroup, data)
end

--- 单位组内第一个单位
---@return GT.unit
function GT.unitGroup:get_first()
    ---@type unit_data
    local data = {
        unit = game_api.get_first_unit_in_group(self.unitGroup)
    }
    return new(GT.unit, data)
end

--- 单位组内最后一个单位
---@return GT.unit
function GT.unitGroup:get_last_unit_in_group()
    ---@type unit_data
    local data = {
        unit = game_api.get_last_unit_in_group(self.unitGroup)
    }
    return new(GT.unit, data)
end


--- 获取【单位组】中伤害排名【整数】的单位实体
---@param rank Int32 排名
---@return GT.unit
function GT.unitGroup:get_damage_statistic_rank_unit(rank)
    ---@type unit_data
    local data = {
        unit = game_api.get_damage_statistic_rank_unit(self.unitGroup,rank)
    }
    return new(GT.unit, data)
end